﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.IO;
using System.Collections;
using Compilador.Lexico;

namespace Compilador
{
    public partial class Compilador : Form
    {

        public delegate void ErrorCompiladorDelegate(string tipo, string desc, int fila, int col, bool parar);

        private AnalizadorLexico analizadorLexico;

        public Compilador()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Para apertura de archivo de logs donde sera un historial de ejecucion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Compilador_Load(object sender, EventArgs e)
        {
            try
            {
                try
                {
                    Utils.Log.path = "C:/Users/uciel/caece/Procesador de Lenguajes/Entregas/AnalizadorLexico/VERSION UCI/Compilador/Compilador/Files/logs.txt";
                    //Utils.Log.path = ConfigurationManager.AppSettings["logFilePath"].ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error al iniciar el log: " + ex.Message);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                this.Close();
            }
        }
        /// <summary>
        /// Para carga de Archivo Input para analizar
        /// </summary>
        private void CargarAnalizadorLexico()
        {
            string pathArchEntrada = this.txtInputFile.Text;
            cargarFontFileInText(pathArchEntrada);
            analizadorLexico = new AnalizadorLexico(pathArchEntrada);
        }
        /// <summary>
        /// Reseteo de Carga de Archivo Input
        /// </summary>
        private void ResetearAnalizadorLexico()
        {
            this.CargarAnalizadorLexico();
        } 
        /// <summary>
        /// Procesar Archivo Cargado de entrada para analizar (Por ahora Static)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_process_Click(object sender, EventArgs e)
        {
            this.dGridFontFile.Rows.Clear();
            //Se vacian las tablas de muestra de tokens encontrados
            this.dGridTokens.Rows.Clear();
            //Llamada a resetear carga de archivo
            this.ResetearAnalizadorLexico();
            //ObtProximoToken
            TokenLexico nToken = this.analizadorLexico.ObtenerProximoToken();
            //Recorrer mientras no llegue al final del archivo
            while (nToken.Token != TokenLexico.TokenType.EOF)
            {
                this.dGridTokens.Rows.Add(nToken.Lexema, nToken.Token, nToken.AntecedidoPorSeparador.ToString(), nToken.Field, nToken.Column);
                nToken = this.analizadorLexico.ObtenerProximoToken();
            }
            //Reconocer hasta donde habia leido como token
            this.dGridTokens.Rows.Add(nToken.Lexema, nToken.Token, nToken.AntecedidoPorSeparador.ToString(), nToken.Field, nToken.Column);
            this.dGridTokens.CurrentCell = this.dGridTokens[0, this.dGridTokens.Rows.Count - 1];
        }
        /// <summary>
        /// Boton de Salir
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        /// <summary>
        /// Cargar en un algun lado para ver el Archivo Fuente
        /// </summary>
        /// <param name="pathFile"></param>
        private void cargarFontFileInText(string pathFile)
        {
            StreamReader objReader = new StreamReader(pathFile);
            string sLine = "";
            ArrayList arrText = new ArrayList();
            while (sLine != null)
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            objReader.Close();
            foreach (string sOutput in arrText)
                this.dGridFontFile.Rows.Add(sOutput);
        }

        private void dGridTokens_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //MessageBox.Show(this.dGridTokens.Rows[e.RowIndex].Cells[3].Value.ToString());
            int rowSelected = Convert.ToInt16(this.dGridTokens.Rows[e.RowIndex].Cells[3].Value);
            int colSelected = Convert.ToInt16(this.dGridTokens.Rows[e.RowIndex].Cells[4].Value);
            this.dGridFontFile.Rows[rowSelected-1].Selected=true;
            this.dGridFontFile.CurrentCell = this.dGridFontFile.SelectedCells[0];
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult result = this.openFD.ShowDialog();
            if (result == DialogResult.OK)
            {
                string fileName = this.openFD.FileName;
                this.txtInputFile.Text = fileName;
            }
        }
    }
}
